import wepy from 'wepy'

/* wepy框架 页面数据bug hack
* 在 路由栈中 存在 相同路由时，后一页面数据会覆盖前一页面
* 使用方法：在需要使用的页面 作为 mixin 引入即可
* */

// 无需备份 字段
const NOT_BACKUP_FIELD = [
    // wepy.page 默认属性 不备份
    'config',
    'mixins',
    'components',
    'data',
    'computed',
    'methods',
    'events',
    'watch'
]

export default class PageDataHack extends wepy.mixin {
    // 恢复数据
    onShow () {
        this.__setPageData()
    }

    // 备份数据
    onHide () {
        // 路由栈中无相同路由时，清空缓存的数据（避免小程序直接关闭等情况下，未清除数据）
        if (!this.__existRepeatPage()) {
            wx.removeStorageSync('page-data-hack')
        }

        const pageDataHack = wx.getStorageSync('page-data-hack') || {}

        const currentPageId = this.__getCurrentPageId()
        pageDataHack[currentPageId] = this.__getPageData()

        wx.setStorageSync('page-data-hack', pageDataHack)
    }

    // 判断 路由栈中 是否存在 相同路由
    __existRepeatPage () {
        // eslint-disable-next-line
        const routeList = getCurrentPages().map(item => item.route)
        const routeListLen = routeList.length

        if (routeListLen > 1) {
            const currentRoute = routeList[routeListLen - 1]
            return routeList.slice(0, routeListLen - 1).includes(currentRoute)
        }

        return false
    }

    // 获取当前页面 唯一标识 __wxWebviewId__
    __getCurrentPageId () {
        // eslint-disable-next-line
        const pageList = getCurrentPages()
        return pageList[pageList.length - 1].__wxWebviewId__
    }

    // 获取需要备份的数据
    __getPageData () {
        const backUpData = {}
        for (const key in this) {
            if (this.hasOwnProperty(key)) {
                const item = this[key]
                // 过滤 $开头字段，function类型，wepy.page 默认属性
                if (
                    key.indexOf('$') !== 0 &&
                    typeof item !== 'function' &&
                    !NOT_BACKUP_FIELD.includes(key)
                ) {
                    backUpData[key] = item
                }
            }
        }

        return backUpData
    }

    // 恢复数据
    __setPageData () {
        const pageDataHack = wx.getStorageSync('page-data-hack')
        const currentPageId = this.__getCurrentPageId()

        // 未备份当前页面数据
        if (!pageDataHack || !pageDataHack[currentPageId]) {
            return
        }

        Object.assign(this, pageDataHack[currentPageId])
        this.$apply()

        delete pageDataHack[currentPageId]
        wx.setStorageSync('page-data-hack', pageDataHack)
    }
}
